#pragma once
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <vector>
#include <array>

/**
 * 点云栅格聚类参数
 */
constexpr int numGrid = 100;        // 网格数量（如250x250覆盖roi区域）
constexpr float roiM = 50.0f;       // 检测区域的米制范围（如周围25m）

/**
 * @brief 对高点点云做网格聚类，返回每个点的聚类ID mask
 * @param[in]   cloud            输入点云（已去除地面的高点）
 * @param[out]  cartesianData    输出栅格聚类mask（二维数组，存放聚类ID）
 * @param[out]  numCluster       聚类数量
 */
void componentClustering(
    const pcl::PointCloud<pcl::PointXYZI>::Ptr& cloud,
    std::array<std::array<int, numGrid>, numGrid>& cartesianData,
    int& numCluster
);

/**
 * @brief 根据聚类mask将点云拆分为各聚类点云
 * @param[in]   cloud           输入点云
 * @param[in]   cartesianData   聚类mask
 * @param[out]  clusteredPoints vector，每个元素为一个聚类点云
 */
void getClusteredPoints(
    const pcl::PointCloud<pcl::PointXYZI>::Ptr& cloud,
    const std::array<std::array<int, numGrid>, numGrid>& cartesianData,
    std::vector<pcl::PointCloud<pcl::PointXYZI>>& clusteredPoints
);